<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

include_once('ExceptionDAO.php');
include_once 'util/MapError.php';

/**
 * DAO para operações de banco de dados para Editora
 * @author Douglas Rafael
 */
class DAOEditora extends CI_Model {

    /**
     * Método para <b>Listar</b> todos os autores cadastrados.
     * @return array TOAutor
     */
    public function get_all($init, $quant) {
        $this->db->order_by("id", "asc");
        $result = $this->db->get('editora', $quant, $init);

        if ($result) {
            $editoras = array();
            foreach ($result->result() as $value) {
                $editora = new TOEditora();
                $editora->codigo = $value->id;
                $editora->nome = $value->nome;
                $editora->telefone = $value->telefone;
                $editora->email = $value->email;
                $editora->site = $value->site;

                array_push($editoras, $editora);
            }
        } else {
            throw new ExceptionDAO("Não foi possível obter a lista de editoras");
        }
        return $editoras;
    }

    /**
     * Retorna o total de registros da tabela editora.
     * @return string total de resgistros
     */
    public function quant_all() {
        return $this->db->count_all_results('editora');
    }

    /**
     * Método para <b>Inserir</b> editora.
     * @param TOEditora $editora
     * @throws ExceptionDAO 
     */
    public function insert(TOEditora $editora) {
        $this->db->set('nome', $editora->nome);
        $this->db->set('telefone', $editora->telefone);
        $this->db->set('email', $editora->email);
        $this->db->set('site', $editora->site);

        $result = $this->db->insert('editora');

        //Pegando o erro caso exista
        if (!$result) {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $editora->nome));
        }
    }

    /**
     * Método para <b>Atualizar</b> dados da editora de acordo com o código.
     * @param TOEditora $editora
     * @throws ExceptionDAO 
     */
    public function update(TOEditora $editora) {
        $this->db->set('nome', $editora->nome);
        $this->db->set('telefone', $editora->telefone);
        $this->db->set('email', $editora->email);
        $this->db->set('site', $editora->site);
        $this->db->where('id', $editora->codigo);

        $result = $this->db->update('editora');

        if (!$result) {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com o $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $editora->nome));
        }
    }

    /**
     * Método para <b>Excluir</b> editora.
     * @param TOEditora $editora
     * @throws ExceptionDAO 
     */
    public function delete(TOEditora $editora) {
        $this->db->where_in('id', $editora->codigo);
        $result = $this->db->delete('editora');

        if (!$result) {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com o $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $editora->nome));
        }
    }

    /**
     * Método para <b>Buscar</b> editora.
     * @param type $init
     * @param type $quant
     * @param type $term
     * @return array
     * @throws ExceptionDAO 
     */
    public function search($init, $quant, $term) {
        $this->db->like('id', $term);
        $this->db->or_like('nome', $term);

        $result = $this->db->get('editora', $quant, $init);

        if ($result) {
            $editoras = array();
            foreach ($result->result() as $value) {
                $editora = new TOEditora();
                $editora->codigo = $value->id;
                $editora->nome = $value->nome;
                $editora->telefone = $value->telefone;
                $editora->email = $value->email;
                $editora->site = $value->site;
                array_push($editoras, $editora);
            }
        } else {
            $num = $this->db->_error_number();
            $msg = $this->db->_error_message();

            //Traduz o tipo de erro de acordo com $num
            $erro = new MapError();
            throw new ExceptionDAO($erro->getError($num, $msg, $editora->nome));
        }
        return $editoras;
    }

    public function quant_search($term) {
        $this->db->like('id', $term);
        $this->db->or_like('nome', $term);

        return $this->db->count_all_results('editora');
    }

}